package com.damuzee.core.web;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.springframework.context.MessageSource;
import org.springframework.ui.ModelMap;

import com.damuzee.core.web.springmvc.WebError;

public class WebErrors extends WebError {
	/**
	 * 默认错误页面
	 */
	public static final String ERROR_PAGE = "/common/error_message";
	/**
	 * 默认错误信息属性名称
	 */
	public static final String ERROR_ATTR_NAME = "errors";

	/**
	 * 通过HttpServletRequest创建WebErrors
	 * 
	 * @param request
	 *            从request中获得MessageSource和Locale，如果存在的话。
	 * @return 如果LocaleResolver存在则返回国际化WebErrors
	 */
	public static WebErrors create(HttpServletRequest request) {
		return new WebErrors(request);
	}

	public WebErrors() {
	}

	public WebErrors(HttpServletRequest request) {
		super(request);
	}

	/**
	 * 构造器
	 * 
	 * @param messageSource
	 * @param locale
	 */
	public WebErrors(MessageSource messageSource, Locale locale) {
		super(messageSource, locale);
	}

	@Override
	protected String getErrorAttrName() {
		return ERROR_ATTR_NAME;
	}

	@Override
	protected String getErrorPage() {
		return ERROR_PAGE;
	}

	/**
	 * 返回Error错误信息，主要用于Ajax验证。格式如：errors.username=错误的用户名。 其中username和表单id一致。
	 * 
	 * @param errors
	 * @param map
	 * @return
	 */
	public String toString(WebErrors errors) {
		Map<String, String> errorMap = errors.getErrors();
		StringBuffer error = new StringBuffer();
		Set<String> set = errorMap.keySet();
		for (String s : set) {
			error.append(s).append(":").append(errorMap.get(s));
		}
		return error.toString();
	}

	/**
	 * 转向错误页面并显示错误信息
	 * 
	 * @param errors
	 * @param map
	 * @return
	 */
	public String showError(WebErrors errors, ModelMap map) {
		List<String> list = new ArrayList<String>();
		Map<String, String> errorMap = errors.getErrors();
		Set<String> set = errorMap.keySet();
		for (String s : set) {
			list.add(errorMap.get(s));
		}

		if (list.size() > 0) {
			map.addAttribute(ERROR_ATTR_NAME, list);
		}
		return ERROR_PAGE;
	}
}
